package org.yoshiori.hatena.graph;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.lang.StringUtils;
import org.yoshiori.commons.security.WSSE;
import org.yoshiori.hatena.HatenaException;

/**
 * <p>
 * はてなグラフ数値登録を行うクラスです.<br/> はてなグラフ数値登録の詳細については「<a
 * href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%B0%A5%E9%A5%D5%BF%F4%C3%CD%C5%D0%CF%BFAPI">はてなグラフ数値登録API</a>」こちらをご覧ください。
 * </p>
 * 
 * <p>
 * 主な使い方としては<br/>
 * 
 * <pre><code>
 * HatenaGraph.postGraph(&quot;Yoshiori&quot;, &quot;pass&quot;, &quot;Test&quot;, null, &quot;10:30&quot;);
 * </code></pre>
 * 
 * と、なります。<br/> <br/> また、<br/> 上記のようにstaticなメソッドとして呼ぶ以外にも<br/>
 * 
 * <pre><code>
 * HatenaGraph graph = new HatenaGraph(&quot;Yoshiori&quot;, &quot;password&quot;);
 * graph.post(&quot;hoge&quot;, null, &quot;1000.10&quot;);
 * </code></pre>
 * 
 * <br/> という使いかたもできます。<br/>
 * 
 * @author yoshiori
 * @see <a
 *      href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%B0%A5%E9%A5%D5%BF%F4%C3%CD%C5%D0%CF%BFAPI">はてなグラフ数値登録API</a>
 */
public class HatenaGraph {

	private static final String URL = "http://graph.hatena.ne.jp/api/post";

	private static final SimpleDateFormat format = new SimpleDateFormat(
			"yyyy-MM-dd");

	private String userName;

	private String password;

	/**
	 * @param userName
	 *            はてなアカウントのid
	 * @param password
	 *            上記はてなアカウントのパスワード
	 */
	public HatenaGraph(String userName, String password) {
		if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) {
			new NullPointerException("userName or password is null.");
		}
		this.userName = userName;
		this.password = password;
	}

	/**
	 * @param graphName
	 *            グラフの名前
	 * @param date
	 *            日付(nullを指定した場合は今日の日付になります)
	 * @param value
	 *            数値
	 */
	public void post(String graphName, Date date, String value) {
		post(userName, password, graphName, date, value);
	}

	/**
	 * @param userName
	 *            はてなアカウントのid
	 * @param password
	 *            上記はてなアカウントのパスワード
	 * @param graphName
	 *            グラフの名前
	 * @param date
	 *            日付(nullを指定した場合は今日の日付になります)
	 * @param value
	 *            数値
	 */
	public static void post(String username, String password, String graphName,
			Date date, String value) {
		HttpClient client = new HttpClient();
		PostMethod post = new PostMethod(URL);
		post.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded; charset=UTF-8");
		post.addRequestHeader("X-WSSE", WSSE.getWsseHeaderValue(username,
				password));
		post.setParameter("graphname", graphName);
		if (date != null) {
			post.setParameter("date", format.format(new Date()));
		}
		post.setParameter("value", value);
		try {
			client.executeMethod(post);
		} catch (HttpException e) {
			throw new HatenaException(e);
		} catch (IOException e) {
			throw new HatenaException(e);
		}
		int statusCode = post.getStatusCode();

		if (201 != statusCode) {
			String body = null;
			try {
				body = post.getResponseBodyAsString();
			} catch (IOException e) {
				throw new HatenaException("status code is " + statusCode);
			}
			throw new HatenaException("status code is " + statusCode + "("
					+ body + ")");
		}
	}
}
